package base.dao;

  
import java.io.Serializable;  
import java.util.List;  
import java.util.Map;

import base.utils.PageEntity;
import base.utils.PagingResult;


/** 
 * baseDAO 
 * @author kyq
 * 
 */  
public interface BaseDao<T,PK extends Serializable> {  
      
    /** 
     * 新增实体 
     * @param entity 实体
     * @return 影响记录条数 
     */  
    public abstract int insertByEntity(T entity);
    
    /**  
     * 修改符合条件的记录  
     * @param entity 实体
     * @return 修改的记录个数，用于判断修改是否成功  
     */    
    public abstract int updateByEntity(T entity);    
    
    /**  
     * 批量修改符合条件的记录  
     * @param entities 实体列表
     * @return 修改的记录个数，用于判断修改是否成功  
     */    
    public abstract int batchUpdateByEntity(List<T> entities);
        
    /**  
     * 按主键删除记录  
     * @param primaryKey 主键对象  
     * @return 删除的对象个数，正常情况=1  
     */    
    public abstract int deleteByPrimaryKey(PK primaryKey);    
    
    /**  
     * 按主键取记录  
     * @param primaryKey 主键值  
     * @return 记录实体对象，如果没有符合主键条件的记录，则返回null  
     */    
    public abstract T selectByPrimaryKey(PK primaryKey);    
    
    /**  
     * 取全部记录  
     * @return 全部记录实体对象的List  
     */    
    public abstract List<T> selectAll();    
        
    /**  
     * 按条件查询记录  
     * @param param 查询条件参数，包括WHERE条件、排序条件
     * @return 符合条件记录的实体对象的List  
     */    
    public abstract List<Map<?,?>> selectByExample(BaseExample param);    
        
    /**  
     * 按条件查询记录，并处理成分页结果  
     * @param param 查询条件参数，包括WHERE条件、分页条件、排序条件  
     * @return PaginationResult对象，包括（符合条件的）总记录数、页实体对象List等  
     */    
    public abstract PagingResult selectPagination(PageEntity param);

    /**  
     * 自定义sql语句，并处理成Map结果
     * @param clause 返回内容，为空则返回全部
     * @param sql 查询条件语句，包括WHERE条件、分页条件
     * @param obj 预编译的变量
     * @return List(Map)对象，返回的字段与数据库一致
     */ 
    public abstract List<Map<?,?>> selectBySql(String[] clause,String sql,Object[] obj);
    
    /**  
     * 自定义sql语句，并处理成Map结果 
     * @param clause 返回内容，为空则返回全部
     * @param sql 查询条件语句，包括WHERE条件、分页条件
     * @param obj 预编译的变量
     * @param page 当前页
     * @param size 每页条数
     * @return PaginationResult对象，包括（符合条件的）总记录数、页实体对象List等  
     */
    public abstract PagingResult selectBySqlPaging(String[] clause,String sql,Object[] obj,Integer page,Integer size);

    
    /**  
     * 调用存储过程并处理成Map结果
     * @param id 传给存储过程的参数
     * @return List(Map)对象，返回的字段与数据库一致
     */ 
   public abstract List<Map<?,?>> selectByProcedure(String procedureName,List<Object> param);
}  